import org.slf4j.Logger
import org.slf4j.LoggerFactory
import java.io.IOException

/**
 * 获取文本数据接口。
 *
 * @return 返回今天的文件数据。
 */
interface StringDataGetter {
    /**
     * 获取今天的文件数据。
     *
     * @return 文件数据字符串。
     * @throws IOException 如果读取文件时发生错误。
     */
    @Throws(IOException::class)
    fun getTodayFileData(): String
}

/**
 * 解析字符串接口。
 *
 * @param origin 原始字符串。
 * @return 解析后的字符串。
 */
interface Analyzable {
    /**
     * 解析原始字符串。
     *
     * @param origin 原始字符串。
     * @return 解析后的字符串。
     */
    fun analyze(origin: String): String
}

/**
 * 文本保存接口。
 *
 * @param text 要保存的文本。
 */
interface TextSaver {
    /**
     * 保存文本。
     *
     * @param text 要保存的文本。
     */
    fun saveText(text: String)
}

/**
 * 获取处理顺序接口。
 *
 * @return 处理顺序的整数值。
 */
interface Ordered {
    /**
     * 获取处理顺序。
     *
     * @return 处理顺序的整数值。
     */
    fun getOrder(): Int
}

/**
 * 插件接口。
 */
interface Plugins {

    /**
     * 执行插件工作。
     *
     * @param origin 原始字符串。
     * @return 处理后的字符串。
     */
    fun work(origin: String): String

    /**
     * 获取插件名称。
     *
     * @return 插件名称字符串。
     */
    fun getPluginName(): String
}

interface PluginsManager{
    fun findPlugins():List<Plugins>
    fun getAfterAnalyzablePlugins():List<AfterAnalyzable>
    fun getBeforeAnalyzablePlugins():List<BeforeAnalyzable>
}

/**
 * 解析前处理接口，继承自处理顺序接口和插件接口。
 */
interface BeforeAnalyzable : Ordered, Plugins {
    /**
     * 在解析前处理原始字符串。
     *
     * @param origin 原始字符串。
     * @return 处理后的字符串。
     */
    fun beforeAnalyze(origin: String): String
}

/**
 * 解析后处理接口，继承自处理顺序接口和插件接口。
 */
interface AfterAnalyzable : Ordered, Plugins {
    /**
     * 在解析后处理原始字符串。
     *
     * @param origin 原始字符串。
     * @return 处理后的字符串。
     */
    fun afterAnalyze(origin: String): String
}
